
@SuppressWarnings("rawtypes")
public class TElementoDijkstra {
	public Comparable[] distancias;
	public Comparable[] vertices;
	
	/**
	 * Metodo constructor.
	 * @param distancias
	 * @param vertices
	 */
	public TElementoDijkstra(Comparable[] distancias, Comparable[] vertices){
		this.distancias = distancias;
		this.vertices = vertices;
	}
	
	/**
	 * Metodo que realiza el algoritmo de Dijkstra sobre el vertice que se encuentra
	 * en la posicion "posicion" del vector "vertices".
	 * @param posicion
	 * @param matrizCostos
	 */
	public void dijkstra(int posicion, Integer[][] matrizCostos, Comparable[] listadoVertices) {
		boolean sinProcesar[] = new boolean[distancias.length];
		for (int i = 0; i < sinProcesar.length; i++) {
			sinProcesar[i] = true;
		}
		int verticeSinCamino = 0;
		for (int i = 0; i < sinProcesar.length; i++) {
			int contador = 0;
			while ((contador < sinProcesar.length) && (!sinProcesar[contador]))
				contador++;
			if (contador < sinProcesar.length){
				verticeSinCamino = contador;
			}
			for (contador++; contador < sinProcesar.length; contador++) {
				int distContador = Integer.parseInt(distancias[contador].toString());
				int distSinCamino = Integer.parseInt(distancias[verticeSinCamino].toString());
				if (sinProcesar[contador]
		                && (distSinCamino > distContador))
				verticeSinCamino = contador;
			}
			sinProcesar[verticeSinCamino] = false;
			int controlFila;
			int controlColumna;
			for (contador = 0; contador < sinProcesar.length; contador++) {
				if (contador >= posicion){
					controlColumna = contador+1;
				} else {
					controlColumna = contador;
				}
				if (verticeSinCamino >= posicion){
					controlFila = verticeSinCamino+1;
				} else {
					controlFila = verticeSinCamino;
				}
				if (sinProcesar[contador] && (matrizCostos[controlFila][controlColumna] != null) && 
						(Integer.parseInt(distancias[contador].toString()) >
							Integer.parseInt(distancias[verticeSinCamino].toString())
									+ matrizCostos[controlFila][controlColumna].intValue())){
					vertices[contador] = listadoVertices[verticeSinCamino];
					distancias[contador] = (Integer.parseInt(distancias[verticeSinCamino].toString())
				                                        + matrizCostos[controlFila][controlColumna].intValue());
				}
			}
		}
	}
	
}
